/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestorvideoclub.jdbc;

import gestorvideoclub.enumeraciones.*;
import gestorvideoclub.Franquicia;
import gestorvideoclub.Pelicula;
import gestorvideoclub.Proveedor;
import gestorvideoclub.Tarifa;
import gestorvideoclub.Ubicacion;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author JAVA
 */
public class PeliculaJDBC {

    /**
     *Obtiene un array de TODAS las peliculas existentes en la BBDD
     */
    public static ArrayList<Pelicula> consultaPeliculas() throws NullPointerException{
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND(productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        ArrayList<Pelicula> listaPelicula = new ArrayList<Pelicula>();
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo"));
                //a�adimos pelicula a la lista
                listaPelicula.add(peli);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaPelicula;
    }

    /**
     * Obtiene la pelicula de la BBDD pasandole como parametro su codigo.
     * para ello tendra que comprobar primero si existe una pelicula con ese codigo.
     * 
     * @param codigo código de la pelicula a devolver
     *
     */
    public static Pelicula obtenerPeliculaPorId(int codigo)throws NullPointerException{
        Pelicula peli = new Pelicula();
        int prueba = ProductoJDBC.compruebaCodigo(codigo);
        if(prueba>0)
        {
            String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.codigo = "+codigo+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND(productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
            Connection con = null;
            try {
                con = AccesoDatos.getConexion();
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery(sql);
                while (rs.next()) {
                    //atributos de superclase
                    peli.setId(rs.getInt("Id"));
                    peli.setCodigo(rs.getInt("productos.codigo"));
                    peli.setTitulo(rs.getString("titulo"));
                    ProductoEnum estado = ProductoEnum.valueOf(rs.getString("productos.estadoProducto"));
                    peli.setEstado(estado);

                    //guardamos tarifa asociada
                    peli.setTarifa(ProductoJDBC.devuelveTarifa(rs.getInt("codigo")));

                    //guardamos objeto ubicacion
                    peli.setUbicacion(ProductoJDBC.devuelveUbicacion(rs.getInt("codigo")));

                    //guardamos proveedor asociado
                    peli.setProveedor(ProductoJDBC.devuelveProveedor(rs.getInt("codigo")));

                    //guardamos Franquicia asociada
                    peli.setFranquicia(ProductoJDBC.devuelveFranquicia(rs.getInt("codigo")));

                    //recogemos atributos propios de pelicula
                    GeneroPeliculaEnum genero = GeneroPeliculaEnum.valueOf(rs.getString("productos.genero"));
                    peli.setGenero(genero);
                    peli.setCodigo(rs.getInt("productos.codigo"));
                    TipoProductoEnum tipoP = TipoProductoEnum.valueOf(rs.getString("productos.tipoProducto"));
                    peli.setTipo(tipoP);
                    peli.setEdadRecomendada(rs.getInt("productos.edadRecomendada"));
                    peli.setDescripcion(rs.getString("descripcion"));
                    peli.setPrecioCompraProducto(rs.getDouble("precioCompra"));
                    peli.setDirector(rs.getString("director"));
                    peli.setReparto(rs.getString("reparto"));
                    peli.setAnyo(rs.getInt("anyo"));
                    peli.setNacionalidad(rs.getString("nacionalidad"));
                    peli.setDuracion(rs.getInt("duracion"));
                }
            } catch (Exception e) {
                System.out.println("Error a obtener la pelicula " + e.getMessage());
            }
            AccesoDatos.cerrarConexion(con);
        }
        return peli;
    }
     /**
     * Utilizaremos este metodo para dar de baja una pelicula.
     * 
     * @param p     Pelicula que daremos de baja 
     */
    public static void modificaEstado(Pelicula p){
        String sql = "update productos set estadoProducto='" + p.getEstado()+"' where productos.codigo=" + p.getCodigo();
        Connection con = null;
        Statement st = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al modificar estado Pelicula " + e.getMessage());
        }
    }

    /**
     * Insercion de pelicula en la BBDD
     * 
     * @param p     Pelicula que se dará de alta
     */
    public static void insertaPelicula(Pelicula p) {
        String sql = "insert into productos (codigo,titulo, estadoProducto,edadRecomendada,descripcion, precioCompra, id_tarifa, id_ubicacion, id_proveedor, id_franquicia,duracion,director, reparto, anyo, nacionalidad, genero,tipoProducto ) values (" + p.getCodigo() + ", '" + p.getTitulo();
        sql += "', '" + p.getEstado().toString() + "', " + p.getEdadRecomendada() + ",' " + p.getDescripcion();
        sql += "', " + p.getPrecioCompraProducto() + ", " + p.getTarifa().getId() + ", " + p.getUbicacion().getId() + ", " + p.getProveedor().getIdProveedor() + ", " + p.getFranquicia().getId() + "," + p.getDuracion() + ", '" + p.getDirector() + "', '" + p.getReparto() + "', " + p.getAnyo() + ", '" + p.getNacionalidad() + "','" + p.getGenero().toString() + "', '" + p.getTipo().toString()+"')";

        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al insertar Pelicula " + e.getMessage());
        }
    }

    /**
     * 
     * como en la modificacion de la pelicula puede haber cambiado su codigo inicil por uno nuevo,
     * le pasamos el parametro 'codigo' para tener el codigo de la pelicula inicial, para poder
     * buscarla en la BBDD. El objeto Pelicula contendrá el codigo nuevo a modificar.
     * 
     * @param p         Pelicula a sobreescribir
     * @param codigo    codigo que utilizaremos para buscar la pelicula en la BBDD
     */
    public static void sobreescribePelicula(Pelicula p, int codigo){
        String sql = "UPDATE productos,tarifas, proveedores, ubicaciones,franquicia set productos.titulo= '"+p.getTitulo()+"' ,productos.codigo="+p.getCodigo();
        sql += ",productos.estadoProducto= '" + p.getEstado().toString() + "' ,productos.edadRecomendada = " + p.getEdadRecomendada() + " ,productos.descripcion= '" + p.getDescripcion()+"' ,productos.precioCompra=";
        sql += p.getPrecioCompraProducto() + ",productos.id_tarifa=" + p.getTarifa().getId() + ",productos.id_ubicacion=" + p.getUbicacion().getId() + ",productos.id_proveedor=" + p.getProveedor().getIdProveedor();
        sql += ",productos.plataforma=" + "0" + ",productos.numJugadores=" + "0" + ",productos.duracion=" + p.getDuracion() + ",productos.director= '" + p.getDirector() + "' ,productos.reparto= '" + p.getReparto()+"'";
        sql += ",productos.anyo=" + p.getAnyo() + ",productos.nacionalidad= '" + p.getNacionalidad() + "' ,productos.genero= '" + p.getGenero().toString() + "' ,productos.tipoProducto= '" + p.getTipo().toString()+"' where productos.codigo=" + codigo;
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al modificar Pelicula " + e.getMessage());
        }
    }

    /**
     * Buscar la/s Pelicula/s que contega/n el nombre pasado por parametro
     * 
     * @param nombre        Nombre de la pelicula a buscar en la BBDD.
     * 
     */
  public static List<Pelicula> consultaPeliculasNombre(String nombre)throws NullPointerException{
        List<Pelicula> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.titulo like  '%"+nombre+"%' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo"));
                //a�adimos pelicula a la lista
                lista.add(peli);
            }

        } catch (Exception e) {
            System.out.println("System.ouError a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }
  
 /**
     * Buscar la/s Pelicula/s de la franquicia pasada como parametro
     * 
     * @param idFran        Id de la franquicia a buscar en la BBDD.
     * 
     */
  public static List<Pelicula> consultaPeliculasFranquicia(int idFran)throws NullPointerException {
        List<Pelicula> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.id_franquicia="+idFran+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo"));
                //a�adimos pelicula a la lista
                lista.add(peli);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }
  
   /**
     * Buscar la/s Pelicula/s filtradas por proveedor
     * 
     * @param idProv        id del proveedor a buscar en la BBDD.
     * 
     */
    public static List<Pelicula> consultaPeliculasProveedor(int idProve)throws NullPointerException{
        List<Pelicula> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.id_proveedor="+idProve+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo"));
                //a�adimos pelicula a la lista
                lista.add(peli);
            }
        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }

  

  /**
   * devuelve una lista de las peliculas con filtradas por el Genero
   * 
   * @param genero      Genero de la pelicula a buscar
   * 
   */
    public static List<Pelicula> consultaPeliculasGenero(GeneroPeliculaEnum genero)throws NullPointerException {
        List<Pelicula> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.genero='"+genero+"' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo")); 
                //a�adimos pelicula a la lista*/
                lista.add(peli);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }
        
    
    /**
   * devuelve una lista de las peliculas con filtradas por el Año
   * 
   * @param anno      Año de la pelicula a buscar
   * 
   */
    public static List<Pelicula> consultaPeliculasAnno(int anno)throws NullPointerException {
        List<Pelicula> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.anyo="+anno+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo")); 
                //a�adimos pelicula a la lista
                lista.add(peli);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }
    /**
     * Devuelve listado de peliculas que contengan el director pasado por parametro
     * 
     * @param director      contiene el director
     */
     public static ArrayList<Pelicula> consultaPeliculasDirector(String director) throws NullPointerException{
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.director like '%"+director+"%' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND(productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        ArrayList<Pelicula> listaPelicula = new ArrayList<Pelicula>();
        Pelicula peli = new Pelicula();
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo")); 
                //a�adimos pelicula a la lista
                listaPelicula.add(peli);
            }
        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaPelicula;
    }
     
     /**
      * Devuelve un listado de peliculas filtradas por Tipo de Producto(DVD ó BLUE-RAY)
      * 
      * @param tipo     contiene tipo de Producto
      * 
      */
     public static ArrayList<Pelicula> consultaPeliculasTipoProducto(TipoProductoEnum tipo)throws NullPointerException {
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.tipoProducto='"+tipo+"' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND(productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        ArrayList<Pelicula> listaPelicula = new ArrayList<Pelicula>();
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo")); 
                //a�adimos pelicula a la lista
                listaPelicula.add(peli);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaPelicula;
    }

     /**
      * Devuelve un listado de peliculas segun el Estado del Producto(Disponible, Dañado, Reservado,...)
      * 
      * @param estadoP      estado del producto
      * @return 
      */
     public static ArrayList<Pelicula> consultaPeliculasEstadoProducto(ProductoEnum estadoP)throws NullPointerException{
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.estadoProducto='"+estadoP+"' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND(productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')";
        Connection con = null;
        ArrayList<Pelicula> listaPelicula = new ArrayList<Pelicula>();
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo")); 
                //a�adimos pelicula a la lista
                listaPelicula.add(peli);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaPelicula;
    }

     /**
      * Devuelve listado de peliculas que contengan el actor pasado por parametro
      * 
      * @param reparto      contiene nombre de actor(nombre completo, apellido,...segun lo que ponga el empleado)
      * @return 
      */
     public static ArrayList<Pelicula> consultaPeliculasReparto(String reparto)throws NullPointerException {
        String sql = "select * from productos,franquicia,tarifas,ubicaciones,proveedores where productos.reparto like '%"+reparto+"%' AND ubicaciones.Id = productos.id_ubicacion AND franquicia.Id = productos.id_franquicia";
        sql += " AND proveedores.Id = productos.id_proveedor AND productos.id_tarifa = tarifas.Id AND(productos.tipoProducto='" + TipoProductoEnum.BlueRay + "' OR productos.tipoProducto='" + TipoProductoEnum.DVD+"')"; 
        Connection con = null;
        ArrayList<Pelicula> listaPelicula = new ArrayList<Pelicula>();
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Pelicula peli = new Pelicula();
                peli = obtenerPeliculaPorId(rs.getInt("productos.codigo"));
                //a�adimos pelicula a la lista
                listaPelicula.add(peli);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener la pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaPelicula;
    }

        
        
}
